<?php
/* Gestiona la relación entre productos y proveedores */
class Prod_prov extends MY_Controller {

    public function __construct()
    {
        # Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
        parent::__construct(get_class($this), 'Prod_proveedor_producto');

        $this->title = 'Productos :: Proveedores';
        $this->CARPETA_VISTAS = 'proveedores/';
        $this->nombre_entidad = 'Proveedor/Producto';
        $this->nombre_entidad_plural = 'Proveedores/Productos';

        $this->pagina_ver = $this->CARPETA_VISTAS . 'proveedor_prod_ver_todos_view';
        $this->pagina_editar = $this->CARPETA_VISTAS . 'proveedor_prod_edit_view';
        $this->pagina_filtros_ver = $this->CARPETA_VISTAS . 'proveedor_prod_filtros_ver_todos_view';
        $this->nuevoPermitido = FALSE; # Lo seteo de esta forma para darle un comportamiento especial al botón nuevo
        $this->exportarExcelPermitido = FALSE;
    } 


    /* IMPORTANTE: DEBE existir esta función. 
     * Crea un objeto de la entidad correspondiente y lo pobla con la información obtenida a 
     * partir del formulario recibido a través de POST.     */
    protected function getObjetoDesdeForm()
    {
        $idEntidad = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
        
        $objEntidad = $this->getObjeto($idEntidad);
        $prov_favorito = $this->input->post('chk_favorito');
        $objEntidad->favorito = $prov_favorito ? TRUE : FALSE;
        $objEntidad->codigo = $this->input->post('txt_codigo');
        
        $fecha_actual = date($this->formatoFechaGuardar);
        $nuevo_importe_pesos = $this->input->post('txt_importe_pesos');
        if ($objEntidad->importe_pesos != $nuevo_importe_pesos){
            // Si cambió el importe respecto del que estaba guardado, almaceno la fecha de actualización
            $objEntidad->fecha_actualizacion = $fecha_actual;
            $objEntidad->importe_pesos = $nuevo_importe_pesos;
        }

        $nuevo_importe_dolares = $this->input->post('txt_importe_dolares');
        if ($objEntidad->importe_dolares != $nuevo_importe_dolares){
            // Si cambió el importe respecto del que estaba guardado, almaceno la fecha de actualización
            $objEntidad->fecha_actualizacion = $fecha_actual;
            $objEntidad->importe_dolares = $nuevo_importe_dolares;
        }
        
        // OBJETOS RELACIONADOS
        $objetosRel = array();
        $id_producto = is_numeric($this->input->post('txt_prod_id')) ? $this->input->post('txt_prod_id') : NULL;
        $objetosRel[] = new Prod_producto($id_producto);

        $id_proveedor = is_numeric($this->input->post('txt_prov_id')) ? $this->input->post('txt_prov_id') : NULL;
        $objetosRel[] = new Persona($id_proveedor);

        $datos['objEntidad'] = $objEntidad;
        $datos['objRelacionados'] = $objetosRel;

        return $datos;
    }

    /* IMPORTANTE: DEBE existir esta función. 
     * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
     * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
     * la entidad actual. Si no se requiriesen, no se agrega nada. */
    protected function cargarDatosRelacionados($dataView)
    {
        return $dataView;
    }

    /* IMPORTANTE: DEBE existir esta función. 
     * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
     * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)        */      
    protected function _aplicarFiltros($dataView = array())
    {
        // Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
        $objEntidad = $this->getObjeto();
        $detalle_filtros = '';

        if(isset($dataView['activo'])) {
            $activo = $dataView['activo'];
            $objEntidad->where_related_persona('baja', !$activo);
            $detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Activos => ' . ($activo ? 'Sí' : 'No');
        }

        if(isset($dataView['id_producto']) || isset($dataView['id_moto'])) {
            if (isset($dataView['id_moto'])) {
                $objMoto = new Prod_moto($dataView['id_moto']);
                $id_producto = $objMoto->prod_producto_id;
            }
            else $id_producto = $dataView['id_producto'];

            if($id_producto != 0) { 
                    $objEntidad->where('prod_producto_id', $id_producto);
                    $objProd = new Prod_producto($id_producto);
                    $detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Producto => (' . $objProd->codigo . ') ' . $objProd->nombre;
            }
        }

        $cod_producto = trim($this->input->post('f_txt_codigo_prod'));
        if(!empty($cod_producto)) {
            $objEntidad->like_related_prod_producto('codigo', $cod_producto);
            $detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Producto => ' . $cod_producto;
        }

        $producto = trim($this->input->post('f_txt_producto'));
        if(!empty($producto)) {
            $objEntidad->like_related_prod_producto('nombre', $producto);
            $detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Producto => ' . $producto;
        }

        if(isset($dataView['id_proveedor'])) {
                $id_prov = $dataView['id_proveedor'];
                if($id_prov != 0) { 
                        $objEntidad->where('persona_id', $id_prov); 
                        $detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Proveedor ';
                }
        }

        $proveedor = trim($this->input->post('f_txt_proveedor'));
        if(!empty($proveedor)) {
                $objEntidad->like_related_persona('razon_social', $proveedor);
                $detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Proveedor => ' . $proveedor;
        }

        $codigo_prod = $this->input->post('f_codigo');
        if($codigo_prod != '') {
                $objEntidad->like('codigo', $codigo_prod);
                $detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Código producto (según proveedor) => ' . $codigo_prod;
        }

        $dataView['objEntidad'] = $objEntidad;
        $dataView['detalle_filtros'] = $detalle_filtros;

        return $dataView;
    }

    /* IMPORTANTE: DEBE existir esta función.
     * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
    protected function validarEliminacion($id_elemento)
    {
        return TRUE;
    }

    /* IMPORTANTE: DEBE existir esta función.
     * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE o CREARSE NUEVO. */
    protected function validarEdicion($id_elemento)
    {
        return TRUE;
    }

    public function editar($id_elemento = NULL, $id_producto = 0, $id_proveedor = 0)
    {
        $dataView['objEntidad'] = $this->getObjeto($id_elemento);
        $dataView['id_producto'] = $id_producto;
        $dataView['id_proveedor'] = $id_proveedor;
        $this->_cargarFormEdicion($dataView);
    }

    public function proveedores_por_producto($id_producto, $es_producto = TRUE, $activo = TRUE){
        if($es_producto) $dataView['id_producto'] = $id_producto;
        else $dataView['id_moto'] = $id_producto;     

        $dataView['activo'] = $activo;
        $datos = $this->_aplicarFiltros($dataView);

        $listado = $datos['objEntidad']->get_iterated();
        if($this->input->is_ajax_request()) {
            $opciones = "<option value=''></option>";
            foreach ($listado as $prov_prod) {
                $opciones .= "<option value='" . $prov_prod->persona_id . "'>" . 
                                $prov_prod->persona->get()->razon_social . "</option>";
            }

            echo $opciones;
        }
        else return $listado;
    }

    public function por_producto($id_producto = 0){
        $dataView = array();
        $dataView['id_producto'] = $id_producto;
        $dataView['id_proveedor'] = 0;
        $dataView['activo'] = TRUE;

        $dataView['entidad_plural'] = 'Proveedores por producto';
        parent::ver_todos($dataView);
    }

    /* Carga todos los registros de un modelo o entidad (de acuerdo a los filtros o los últimos agregados) */
    public function ver_todos($dataView = array())
    {
        $dataView['id_producto'] = 0;
        $dataView['id_proveedor'] = 0;
        parent::ver_todos($dataView);
    }

    public function guardar()
    {
        $datos = $this->getObjetoDesdeForm();
        $objEntidad = $dataView['objEntidad'] = $datos['objEntidad'];
        $objRelacionados = $datos['objRelacionados'];

        # Se manejan transacciones para interactuar con la BD
        $objEntidad->trans_begin();
        $operacion_exitosa = $objEntidad->save($objRelacionados);
        if(!$operacion_exitosa && !$objEntidad->valid)
        { 
            # Falló la validación de datos de acuerdo a las reglas de los modelos
            $dataView['error'] = $objEntidad->error->string; 
        }
        else
        {
            if ($objEntidad->trans_status() === FALSE) # Si la transacción falló, hago un rollback 
                $objEntidad->trans_rollback();
            else # Transacción exitosa, realizo el commit 
            {
                if($objEntidad->favorito){
                    // Si se marcó el proveedor actual como favorito, le quito la posible marca a los otros
                    $prov_no_favoritos = new Prod_proveedor_producto();
                    $prov_no_favoritos->where('prod_producto_id', $objEntidad->prod_producto_id);
                    $prov_no_favoritos->where('persona_id !=', $objEntidad->persona_id);
                    $prov_no_favoritos->update('favorito', FALSE);
                }

                $objEntidad->trans_commit();
            }

            # Almaceno todos los errores que hubieran podido ocurrir
            $dataView['error'] = $objEntidad->error->string;
        }

        if($dataView['error'] != '') {
            // Falló el intento de guardar
            $this->_cargarFormEdicion($dataView, TRUE); 
        }
        else $this->por_producto($objEntidad->prod_producto_id);
    }

    protected function setAyuda($dataView) {
        $dataView['ayuda_objetivo'] = 'Visualizar y gestionar los proveedores de cada producto cargados en el sistema.';
        $dataView['descripcion_breve'] = 'Se pueden definir todos los productos comercializados con cada proveedor, y de la misma manera, 
                                            todos los proveedores que tienen disponible determinado producto, definiendo el código que 
                                            utiliza el proveedor para el producto en cuestión, y los montos de comercialización del mismo.';
        
        $dataView['ayuda_explicación_adicional'] = 'Además de la funcionalidad mencionada arriba, se puede visualizar tanto la información del 
                                                    producto como la del proveedor, a través de los botones ' . 
                                                    $this->extras_form->viewButton('', 0, 'Visualizar Producto', 'fa-cubes', FALSE, TRUE) .
                                                    ' y ' . 
                                                    $this->extras_form->viewButton('', 0, 'Visualizar Proveedor', 'fa-suitcase', FALSE, TRUE) . 
                                                    ' respectivamente.';
        $dataView['boton_visualizar'] = TRUE;

        return $dataView;
    }
}